package com.example.userservice.novel.service;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.example.userservice.novel.entity.NovelStructure;
import com.example.userservice.novel.entity.SimpleCharacter;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SimpleNovelService {

    private final Generation generation;

    public SimpleNovelService() {
        this.generation = new Generation();
    }

    /**
     * 根据小说名称生成完整架构
     */
    public NovelStructure generateNovelStructure(String novelName) {
        try {
            // 构建对话式提示词
            String prompt = buildNovelPrompt(novelName);

            GenerationParam param = GenerationParam.builder()
                    .model("qwen-plus")
                    .prompt(prompt)
                    .temperature(0.7F)
                    .maxTokens(2000)
                    .build();

            GenerationResult result = generation.call(param);
            String aiResponse = result.getOutput().getText();

            // 解析AI回复
            return parseAIResponse(novelName, aiResponse);

        } catch (Exception e) {
            throw new RuntimeException("生成小说架构失败: " + e.getMessage(), e);
        }
    }

    /**
     * 分步骤生成小说架构（对话式）
     */
    public NovelStructure generateStepByStep(String novelName) {
        NovelStructure structure = new NovelStructure();
        structure.setNovelName(novelName);

        // 步骤1: 生成主题和核心概念
        structure.setTheme(generateTheme(novelName));

        // 步骤2: 生成主要角色
        structure.setMainCharacters(generateCharacters(novelName, structure.getTheme()));

        // 步骤3: 生成故事大纲
        structure.setPlotOutline(generatePlot(novelName, structure.getTheme(), structure.getMainCharacters()));

        // 步骤4: 生成世界观
        structure.setWorldSetting(generateWorld(novelName, structure.getTheme()));

        structure.setGeneratedAt(new Date());
        return structure;
    }

    /**
     * 生成主题和核心概念
     */
    private String generateTheme(String novelName) {
        String prompt = String.format("""
                请为小说《%s》生成一个核心主题和故事概念。
                要求：
                1. 用一句话概括核心主题
                2. 描述故事的核心冲突
                3. 说明想要表达的情感或思想
                请直接返回主题描述，不要额外解释。
                """, novelName);

        return callAI(prompt);
    }

    /**
     * 生成主要角色
     */
    private List<SimpleCharacter> generateCharacters(String novelName, String theme) {
        String prompt = String.format("""
                为小说《%s》设计2-3个主要角色。
                主题背景：%s
                
                每个角色请包含：
                - 姓名
                - 身份背景
                - 性格特点
                - 目标动机
                - 成长变化
                
                请用以下格式返回：
                角色1姓名|身份|性格|目标|成长
                角色2姓名|身份|性格|目标|成长
                """, novelName, theme);

        String response = callAI(prompt);
        return parseCharacters(response);
    }

    /**
     * 生成故事大纲
     */
    private String generatePlot(String novelName, String theme, List<SimpleCharacter> characters) {
        String characterDesc = characters.stream()
                .map(c -> c.getName() + "(" + c.getIdentity() + ")")
                .collect(Collectors.joining("、"));

        String prompt = String.format("""
                为小说《%s》编写一个完整的故事大纲。
                主题：%s
                主要角色：%s
                
                请包含：
                1. 故事开端（背景引入和激励事件）
                2. 发展过程（主要冲突和转折点）
                3. 高潮部分（最关键的情节）
                4. 结局安排（故事收尾方式）
                
                请用简洁的语言描述，300字左右。
                """, novelName, theme, characterDesc);

        return callAI(prompt);
    }

    /**
     * 生成世界观设定
     */
    private String generateWorld(String novelName, String theme) {
        String prompt = String.format("""
                为小说《%s》设计世界观设定。
                主题：%s
                
                请描述：
                - 故事发生的时间和地点
                - 特殊的社会规则或物理法则
                - 重要的场景或地点
                - 与主题相关的环境要素
                
                用150字左右简要描述。
                """, novelName, theme);

        return callAI(prompt);
    }

    /**
     * 统一的AI调用方法
     */
    private String callAI(String prompt) {
        try {
            GenerationParam param = GenerationParam.builder()
                    .model("qwen-turbo")
                    .prompt(prompt)
                    .temperature(0.7F)
                    .maxTokens(1000)
                    .build();

            GenerationResult result = generation.call(param);
            return result.getOutput().getText();

        } catch (Exception e) {
            return "生成内容时出现错误: " + e.getMessage();
        }
    }

    /**
     * 构建完整的小说生成提示词
     */
    private String buildNovelPrompt(String novelName) {
        return String.format("""
                你是一个专业的小说创作助手。请为小说《%s》设计完整的架构。
                
                请按照以下结构提供内容：
                
                【主题核心】
                用一句话说明小说的核心主题和思想
                
                【主要角色】
                列出2-3个主要角色，每个角色包含：
                - 姓名和身份
                - 性格特点
                - 目标动机
                - 成长轨迹
                
                【故事大纲】
                分为四个部分：
                1. 开端：故事如何开始，激励事件是什么
                2. 发展：主要冲突和重要转折
                3. 高潮：最精彩的关键情节
                4. 结局：故事如何收尾
                
                【世界观】
                描述故事发生的背景世界，包括：
                - 时间地点设定
                - 特殊规则或设定
                - 重要场景
                
                【风格建议】
                建议的叙事风格和语言特点
                
                请直接按照上述格式返回，不要额外解释。
                """, novelName);
    }

    /**
     * 解析AI的回复
     */
    private NovelStructure parseAIResponse(String novelName, String aiResponse) {
        NovelStructure structure = new NovelStructure();
        structure.setNovelName(novelName);
        structure.setRawResponse(aiResponse);
        structure.setGeneratedAt(new Date());

        // 简单解析各个部分（实际应用中可以更复杂）
        try {
            String[] sections = aiResponse.split("【|】");

            for (int i = 0; i < sections.length; i++) {
                String section = sections[i].trim();
                if (section.contains("主题核心")) {
                    structure.setTheme(extractSectionContent(sections, i));
                } else if (section.contains("主要角色")) {
                    structure.setMainCharacters(parseCharacters(extractSectionContent(sections, i)));
                } else if (section.contains("故事大纲")) {
                    structure.setPlotOutline(extractSectionContent(sections, i));
                } else if (section.contains("世界观")) {
                    structure.setWorldSetting(extractSectionContent(sections, i));
                } else if (section.contains("风格建议")) {
                    structure.setWritingStyle(extractSectionContent(sections, i));
                }
            }
        } catch (Exception e) {
            // 如果解析失败，使用原始回复
            structure.setTheme("解析失败，请查看原始回复");
        }

        return structure;
    }

    private String extractSectionContent(String[] sections, int index) {
        if (index + 1 < sections.length) {
            return sections[index + 1].trim();
        }
        return "";
    }

    /**
     * 解析角色信息
     */
    private List<SimpleCharacter> parseCharacters(String charactersText) {
        List<SimpleCharacter> characters = new ArrayList<>();

        try {
            String[] lines = charactersText.split("\n");
            for (String line : lines) {
                line = line.trim();
                if (line.contains("|")) {
                    String[] parts = line.split("\\|");
                    if (parts.length >= 5) {
                        SimpleCharacter character = new SimpleCharacter();
                        character.setName(parts[0].trim());
                        character.setIdentity(parts[1].trim());
                        character.setPersonality(parts[2].trim());
                        character.setGoal(parts[3].trim());
                        character.setGrowth(parts[4].trim());
                        characters.add(character);
                    }
                } else if (line.contains("-") && line.contains("姓名")) {
                    // 处理其他格式的角色描述
                    SimpleCharacter character = new SimpleCharacter();
                    character.setName(extractValue(line, "姓名"));
                    character.setIdentity(extractValue(line, "身份"));
                    characters.add(character);
                }
            }
        } catch (Exception e) {
            // 如果解析失败，创建一个默认角色
            SimpleCharacter defaultChar = new SimpleCharacter();
            defaultChar.setName("主角");
            defaultChar.setIdentity("主要角色");
            defaultChar.setPersonality("待完善");
            defaultChar.setGoal("待完善");
            defaultChar.setGrowth("待完善");
            characters.add(defaultChar);
        }

        return characters;
    }

    private String extractValue(String text, String key) {
        // 简单的文本提取逻辑
        int index = text.indexOf(key);
        if (index != -1) {
            return text.substring(index + key.length()).trim();
        }
        return "";
    }
}
